package com.geek.javase.ch15.work.productionlock;

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/*
 *@author wangpeng
 *2025/10/31 20:30
 *@description 仓库
 */

/**
 * Lock 替代 synchronized：使用ReentrantLock显式加锁和解锁，提供了更灵活的控制。
 * Condition 替代 wait/notify：使用Condition可以精确地控制哪些线程被唤醒。这里我们为生产者和消费者各创建了一个Condition，这样可以避免不必要的唤醒和竞争。
 * 异常处理：在await()调用中检查并处理InterruptedException，并恢复中断状态。
 */
public class House {

    private int num = 0;

    // 创建Lock对象
    private final Lock lock = new ReentrantLock();
    // 创建两个Condition，分别用于生产者和消费者等待/唤醒
    private final Condition producerCondition = lock.newCondition();
    private final Condition consumerCondition = lock.newCondition();

    //生产货物
    public void store(){
        lock.lock();  // 获取锁
        try {
            while (num >= 10) {
                System.out.println("仓库已满，生产者需要进入等待~");
                try {
                    producerCondition.await();  // 生产者等待
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                    throw new RuntimeException(e);
                }
            }
            System.out.println(Thread.currentThread().getName() + "生产了" + (++num));
            consumerCondition.signalAll();  // 唤醒所有消费者
        } finally {
            lock.unlock();  // 释放锁
        }
    }

    //销售货物
    public void sale(){
        lock.lock();  // 获取锁
        try {
            while (num <= 0) {
                System.out.println("仓库已空，消费者需要进入等待~");
                try {
                    consumerCondition.await();  // 消费者等待
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                    throw new RuntimeException(e);
                }
            }
            System.out.println(Thread.currentThread().getName() + "消费了" + (num--));
            producerCondition.signalAll();  // 唤醒所有生产者
        } finally {
            lock.unlock();  // 释放锁
        }
    }
}
